package com.configtools.model;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import com.fasterxml.jackson.annotation.JsonIgnore;

/**
 * 配置设置数据模型
 * 包含代码生成的各种配置参数
 * 
 * @author ConfigTools
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConfigSettings {
    
    /** 包名 - 生成Java类的包名 */
    private String packageName = "com.configtools.generated";
    
    /** 类名前缀 - 为生成的类名添加统一前缀 */
    private String classPrefix = "";
    
    /** 类名后缀 - 为生成的类名添加统一后缀 */
    private String classSuffix = "Cfg";
    
    /** 作者信息 - 生成代码中的作者信息 */
    private String authorName = System.getProperty("user.name");
    
    /** 启动时自动加载上次目录 */
    private boolean autoLoadLastDirectory = true;
    
    /** 编码格式 */
    private String encoding = "UTF-8";
    
    /** 上次选择的Excel目录 */
    private String lastExcelDirectory = "";
    
    /** 上次选择的输出目录 */
    private String lastOutputDirectory = "";
    
    /**
     * 验证包名格式是否正确
     * 
     * @return 是否为有效的包名
     */
    @JsonIgnore
    public boolean isValidPackageName() {
        if (packageName == null || packageName.trim().isEmpty()) {
            return false;
        }
        
        // Java包名规则：由小写字母、数字、下划线组成，用点分隔
        String regex = "^[a-z][a-z0-9_]*(?:\\.[a-z][a-z0-9_]*)*$";
        return packageName.matches(regex);
    }
    
    /**
     * 验证类名前缀是否有效
     * 
     * @return 是否为有效的Java标识符
     */
    @JsonIgnore
    public boolean isValidClassPrefix() {
        if (classPrefix == null || classPrefix.trim().isEmpty()) {
            return true; // 前缀可以为空
        }
        
        // Java标识符规则
        return classPrefix.matches("^[A-Za-z][A-Za-z0-9_]*$");
    }
    
    /**
     * 验证类名后缀是否有效
     * 
     * @return 是否为有效的Java标识符
     */
    @JsonIgnore
    public boolean isValidClassSuffix() {
        if (classSuffix == null || classSuffix.trim().isEmpty()) {
            return true; // 后缀可以为空
        }
        
        // Java标识符规则
        return classSuffix.matches("^[A-Za-z][A-Za-z0-9_]*$");
    }
    
    /**
     * 获取完整的类名（包含前缀和后缀）
     * 
     * @param baseName 基础名称
     * @return 完整的类名
     */
    @JsonIgnore
    public String getFullClassName(String baseName) {
        StringBuilder sb = new StringBuilder();
        
        if (classPrefix != null && !classPrefix.trim().isEmpty()) {
            sb.append(classPrefix);
        }
        
        sb.append(baseName);
        
        if (classSuffix != null && !classSuffix.trim().isEmpty()) {
            sb.append(classSuffix);
        }
        
        return sb.toString();
    }
    
    /**
     * 获取完整的包路径（相对于输出目录）
     * 
     * @return 包路径
     */
    @JsonIgnore
    public String getPackagePath() {
        if (packageName == null || packageName.trim().isEmpty()) {
            return "";
        }
        
        return packageName.replace('.', '/');
    }
    
    /**
     * 创建默认配置
     * 
     * @return 默认配置实例
     */
    public static ConfigSettings createDefault() {
        return new ConfigSettings();
    }
    
    /**
     * 复制配置设置
     * 
     * @return 配置副本
     */
    public ConfigSettings copy() {
        ConfigSettings copy = new ConfigSettings();
        copy.packageName = this.packageName;
        copy.classPrefix = this.classPrefix;
        copy.classSuffix = this.classSuffix;
        copy.authorName = this.authorName;
        copy.autoLoadLastDirectory = this.autoLoadLastDirectory;
        copy.encoding = this.encoding;
        copy.lastExcelDirectory = this.lastExcelDirectory;
        copy.lastOutputDirectory = this.lastOutputDirectory;
        return copy;
    }
}
